package cn.security.config;

import cn.security.service.UserAuthenticationServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

//// 开启 Security ，
// 但是在 org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration 中的
// org.springframework.boot.autoconfigure.security.servlet.WebSecurityEnablerConfiguration 类上
// 已经标注 @EnableWebSecurity
//@EnableWebSecurity
@Configuration
public class MySecurityConfig extends WebSecurityConfigurerAdapter {


    /**
     * 申明 {bcrypt} 对应的 BCryptPasswordEncoder 密码编码器 bean 对象；
     * 在进行 cn.security.service.UserServiceImpl#loadUserByUsername(java.lang.String) 时，注入使用
     * @return
     */
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    /**
     * 方式三：重写 WebSecurityConfigurerAdapter 中的 userDetailsServiceBean。<br/>
     * 官方推荐使用 userDetailsServiceBean
     * @return
     * @throws Exception
     */
    @Bean
    @Override
    public UserDetailsService userDetailsServiceBean() throws Exception {
        // 采取手动实例化 指定的 UserAuthenticationServiceImpl 方式
        return new UserAuthenticationServiceImpl();
    }
}
